/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Narrativa;

import Cenarios.Cenarios;
import Cenarios.Lugar;
import Desafios.Desafios;
import Personagem.Mensageiro;
import Personagem.Personagem;
import Recurso.Arma;
import Recurso.Equipamento;
import Recurso.Recurso;
import java.util.ArrayList;

/**
 *
 * @author Daniele Martins
 */
public class Narrativa {

    private Cenarios cenario;
    private Mensageiro mensageiro;
    private EntradaDeDados entrada;
    private Interface texto;

    public Narrativa() {
        /*Metodo construtor da narrativa, que inicializa todos objetos necessarios.
         *Cria os Personagens inimigos e amigos,
         cria tambem os lugares que recebem com parametro um desafio e um recurso a ser usado */

        Personagem inimigo = new Personagem("Inimigo inicio", "", 10);
        Personagem inimigo2 = new Personagem("Bastiao", "lala", 10);
        Personagem inimigo3 = new Personagem("Kapiroto", "lala", 10);
        Personagem inimigo4 = new Personagem("Marcia", "lala", 10);
        Personagem inimigo5 = new Personagem("JP", "lala", 10);
        Personagem inimigo6 = new Personagem("Alencar", "lala", 10);
        Personagem inimigo7 = new Personagem("Welfer", "lala", 10);
        Personagem amigo = new Personagem("Cleo", "deserto", 10);

        Recurso cantil = new Recurso("cantil");
        Recurso corda = new Recurso("corda");
        Equipamento canoa = new Equipamento("corda");
        Arma faca = new Arma("faca", 0, "faca");

        Desafios desafio1 = new Desafios(null, 15); //desafio da batalha
        Desafios desafio2 = new Desafios(cantil, 15);
        Desafios desafio3 = new Desafios(corda, 15);
        Desafios desafio4 = new Desafios(canoa, 15);


        /*Cria os nove locais*/
        Lugar inicio = new Lugar("Inicio", desafio1, inimigo); // batalha
        Lugar deserto = new Lugar("Deserto", desafio2, amigo);
        Lugar estrada = new Lugar("Estrada", desafio1, inimigo2); //batalha
        Lugar ponte = new Lugar("Ponte", desafio3, amigo);
        Lugar cidade = new Lugar("Cidade", desafio1, inimigo3);
        Lugar charco = new Lugar("Charco", desafio1, inimigo4);  // batalha
        Lugar charcos = new Lugar("Charco Sul", desafio4, amigo);
        Lugar charcon = new Lugar("Charco Norte", desafio4, amigo);
        Lugar arroio = new Lugar("Arroio", desafio1, inimigo); //batalha

        cidade.adicionaArma(faca);
        charcon.adicionaArma(faca);
        
        ArrayList<Lugar> lugares1 = new ArrayList<Lugar>();
        lugares1.add(null);
        lugares1.add(null);
        lugares1.add(charcon);
        lugares1.add(estrada);
        inicio.setAcessos(lugares1);

        ArrayList<Lugar> lugares2 = new ArrayList<Lugar>();
        lugares2.add(inicio);
        lugares2.add(null);
        lugares2.add(deserto);
        lugares2.add(charco);
        charcon.setAcessos(lugares2);

        ArrayList<Lugar> lugares3 = new ArrayList<Lugar>();
        lugares3.add(charcon);
        lugares3.add(null);
        lugares3.add(null);
        lugares3.add(arroio);
        deserto.setAcessos(lugares3);

        ArrayList<Lugar> lugares4 = new ArrayList<Lugar>();
        lugares4.add(null);
        lugares4.add(inicio);
        lugares4.add(charco);
        lugares4.add(cidade);
        estrada.setAcessos(lugares4);

        ArrayList<Lugar> lugares5 = new ArrayList<Lugar>();
        lugares5.add(estrada);
        lugares5.add(charcon);
        lugares5.add(ponte);
        lugares5.add(charcos);
        charco.setAcessos(lugares5);

        ArrayList<Lugar> lugares6 = new ArrayList<Lugar>();
        lugares6.add(charco);
        lugares6.add(deserto);
        lugares6.add(null);
        lugares6.add(arroio);
        ponte.setAcessos(lugares6);

        ArrayList<Lugar> lugares7 = new ArrayList<Lugar>();
        lugares7.add(null);
        lugares7.add(estrada);
        lugares7.add(charcos);
        lugares7.add(null);
        cidade.setAcessos(lugares7);

        ArrayList<Lugar> lugares8 = new ArrayList<Lugar>();
        lugares8.add(cidade);
        lugares8.add(charco);
        lugares8.add(arroio);
        lugares8.add(null);
        charcos.setAcessos(lugares8);

        ArrayList<Lugar> lugares9 = new ArrayList<Lugar>();
        lugares9.add(charcos);
        lugares9.add(ponte);
        lugares9.add(null);
        lugares9.add(null);
        arroio.setAcessos(lugares9);

        cenario = new Cenarios();
        cenario.setIniicio(inicio);
        mensageiro = new Mensageiro("Mensageiro Farrapo", "", 15);
        mensageiro.andar(inicio);
        entrada = new EntradaDeDados();
        texto = new Interface();

    }

    public void iniciarJogo() {
        System.out.println("************* Bem vindo ao jogo *************");
        texto.historiaInicial();
        percorreCaminhos();

    }

    public void batalha(Lugar lugar) { //Método batalha responsavel por executar a batalha
        texto.lutarContraInimigo();
        if (texto.getComando() == 1) {
            lugar.getDesafios().enfrentarBatalha(mensageiro, lugar.getAlguem(), lugar.getDesafios().definirAtaque(), lugar.getDesafios().definirAtaque());
        } else {
            texto.desistiuLutarContraInimigo(mensageiro);
        }

    }

    public void dicaAmigo(Lugar lugar) {
        texto.amigoNoLocal();
        if (texto.getComando() == 1) {
            System.out.println("Ouvir dica amigo do deserto");
        } else {
            System.out.println("Não ouviu dica amigo deserto");
        }
    }

    public void chegadaLocal(Lugar atual) {
        switch (atual.getNome()) {
            case "Inicio":
                texto.inicio();
                dicaAmigo(atual);
                menu(atual);
                break;
            case "Deserto":
                texto.deserto();
                dicaAmigo(atual);
                menu(atual);
                atual.getDesafios().enfrentarDesafio(mensageiro);
                menu(atual);
                break;
            case "Estrada":
                texto.estrada();
                batalha(mensageiro.getPosicaoAtual());
                menu(atual);
                break;
            case "Ponte":
                texto.ponte();
                dicaAmigo(atual);
                menu(atual);
                atual.getDesafios().enfrentarDesafio(mensageiro);
                menu(atual);
                break;
            case "Cidade":
                texto.cidade();
                batalha(mensageiro.getPosicaoAtual());
                entregarCarta();
                menu(atual);
                break;
            case "Charco":
                dicaAmigo(atual);
              //  texto.charco();
                menu(atual);
                atual.getDesafios().enfrentarDesafio(mensageiro);
                menu(atual);
                break;
            case "Charco Norte": //mudar 
                texto.charcoNorte();
                dicaAmigo(atual);
                menu(atual);
                atual.getDesafios().enfrentarDesafio(mensageiro);
                menu(atual);
                break;
            case "Charco Sul": //mudar
                texto.charcoSul();
                dicaAmigo(atual);
                menu(atual);
                atual.getDesafios().enfrentarDesafio(mensageiro);
                menu(atual);
                break;
            case "Arroio":
                texto.arroio();
                batalha(mensageiro.getPosicaoAtual());
                menu(atual);
                break;
        }
    }
    
    public void entregarCarta(){
        texto.entregarCarta();
        if (texto.getComando() == 1) {
            System.out.println("****** Mensageiro completou sua missão ******");
            System.out.println("****** Carta foi entregue ******");
            System.out.println("****** Fim do Jogo ******");
           
            
        }else{
            System.out.println("****** Carta não foi entregue ******");
            System.out.println("****** Fim do Jogo ******");
        }
         System.exit(0);
    }

    public void menu(Lugar lugar) {
        //   System.out.println("Mensageiro está no : " + mensageiro.getPosicaoAtual().getNome());
        int i = 0;
        while (i >= 0) {
            texto.menu(mensageiro);
            switch (texto.getComando()) {
                case 1:
                    //comer
                    texto.comeu(mensageiro);
                    i++;
                    break;
                case 2:
                    //dormir 
                    texto.dormiu(mensageiro);
                    i++;
                    break;
                case 3:
                    // beber
                    texto.mostraBeber(true, mensageiro);
                    i++;
                    break;
                case 4:
                    //recursos                    
                    addRecursos(lugar);
                    i++;
                    break;
                case 5:
                    //ver inverntario
                    conferirItens();
                    i++;
                    break;
                case 6:
                    //ver vida
                    texto.mostraVida(mensageiro);
                    i++;
                    break;

                case 7:
                    // andar
                    // System.out.println("Andou o/");
                    mensageiro.perderVida(20);
                    mensageiro.andar(lugar);
                    i = -1;
                    break;
                case 8:
                    texto.verMapa(mensageiro);
                    i++;
            }
        }

    }

    public void addRecursos(Lugar lugar) {
        //   texto.addRecurso();
        if (lugar.getListadeRecursos() == null) {
            System.out.println("Lugar não possui recursos.");
        } else {
            int x = 0;
            do {
                System.out.println("Recursos:");
                System.out.println("\n" + x + ":" + lugar.getListadeRecursos().get(x).getNome());
                x++;
            } while (x < lugar.getListadeRecursos().size());
            System.out.println("\nPara pegar algum recurso digite o número correspondente");
            int resposta = this.entrada.lerInteiro();
            if (resposta >= lugar.getListadeRecursos().size()) {
                System.out.println("Você escolheu não pegar recurso...\n");
            } else {
              //  this.mensageiro.getItens().add(lugar.recolherRecurso(resposta));
                System.out.print("Recurso adicionado com sucesso em sua mala de garupa\n");
            }
            texto.maisRecurso();
            int r = this.entrada.lerInteiro();
            if (r == 1) {
                addRecursos(lugar);
            }
        }
    }

    public void percorreCaminhos() {
        Lugar lugar;
        for (int i = 0; i < this.cenario.getLocais().length; i++) {
            texto.escolhaCaminho();
            switch (texto.getComando()) {
                case 1:
                    lugar = this.mensageiro.getPosicaoAtual().getAcessos().get(0);
                    if (verificaPrecipicio(lugar) == false) {
                        chegadaLocal(lugar);
                        this.mensageiro.setPosicaoAtual(lugar);
                    }
                    break;
                case 2:
                    lugar = this.mensageiro.getPosicaoAtual().getAcessos().get(1);
                    if (verificaPrecipicio(lugar) == false) {
                        chegadaLocal(lugar);
                        this.mensageiro.setPosicaoAtual(lugar);
                    }
                    break;
                case 3:
                    lugar = this.mensageiro.getPosicaoAtual().getAcessos().get(2);
                    if (verificaPrecipicio(lugar) == false) {
                        chegadaLocal(lugar);
                        this.mensageiro.setPosicaoAtual(lugar);
                    }
                    break;
                case 4:
                    lugar = this.mensageiro.getPosicaoAtual().getAcessos().get(3);
                    if (verificaPrecipicio(lugar) == false) {
                        chegadaLocal(lugar);
                        this.mensageiro.setPosicaoAtual(lugar);
                    }

            }

        }
    }

    public boolean verificaPrecipicio(Lugar lugar) {
        if (lugar == null) {
            System.out.println("Mensageiro caiu no precipicio e morreu.");
            System.exit(0);

            return true;
        } else {
            return false;
        }
    }

    public void conferirItens() {

        int i;
        if (mensageiro.getItens() == null) {
            System.out.println("Mensageiro você não possui nenhum recurso.");
        } else {
            for (i = 0; i < mensageiro.getItens().size(); i++) {
                System.out.println(i + ":" + this.mensageiro.getItens().get(i).getNome());
            }
            System.out.println("Digite o número correspondente ao recurso que deseja utilizar...");
            System.out.println("Se não quiser utilizar nenhum recurso digite[número maior que o número de recursos]");
            int op = 0;
            if (op > mensageiro.getItens().size()) {
                System.out.println("\nVocê escolheu não usar item...");
            } else {
                System.out.println("Recurso " + this.mensageiro.getItens().get(op) + " utilizado com sucesso...");
                //  this.mensageiro.usarItem(this.mensageiro.getRecursos().get(resposta));

            }
        }
    }
}
